package gmwxapplet

import (
	"fmt"
	"github.com/aliyun/aliyun-oss-go-sdk/oss"
	"github.com/gin-gonic/gin"
	"log"
	"os"
	"path"
	"strings"
	"time"
	"yundian/internel/pkg/dingo"
	"yundian/internel/pkg/dingo/global"
	. "yundian/internel/pkg/dingo/result"
	"yundian/internel/pkg/utils"
)

// ------------上传相关请求处理---------------//

// UploadImage 上传图片
func UploadImage(ctx *gin.Context) {
	//userId, err := helper.GetUserIdFromCtx(ctx)
	//dingo.ErrorIf(err).Unwrap()
	file, err := ctx.FormFile("file")

	if err != nil {
		Response(ctx)("上传失败!请上传文件", CodeError, nil)(Error)
	}
	imgType := []string{"image/bmp", "image/png", "image/gif", "image/jpg", "image/jpeg", "image/pjpeg", "image/x-png"}
	fileExt := strings.ToLower(path.Ext(file.Filename))
	// 判断 文件类型
	if !utils.Contains(imgType, file.Header.Get("Content-Type")) {
		Response(ctx)("上传失败!文件类型错误", CodeError, nil)(Error)
	}
	// 判断 文件后缀
	if fileExt != ".png" && fileExt != ".jpg" && fileExt != ".gif" && fileExt != ".jpeg" {
		Response(ctx)("上传失败!只允许png,jpg,gif,jpeg文件", CodeError, nil)(Error)
	}
	// 判断 文件大小 1024*1024*10
	if file.Size > 10485760 {
		Response(ctx)("上传失败!只允许小于10M的文件", CodeError, nil)(Error)
	}
	fileName := utils.Str2Md5(fmt.Sprintf("%s%s", file.Filename, time.Now().String()))
	fileDir := fmt.Sprintf("%s/%d%s/", "static/upload", time.Now().Year(), time.Now().Month().String())
	filePath := fmt.Sprintf("%s%s%s", fileDir, fileName, fileExt)

	// 判断文件路径是否存在
	ok, err := utils.PathExists(fileDir)
	dingo.ErrorIf(err).Unwrap()
	if !ok {
		dingo.ErrorIf(os.Mkdir(fileDir, os.ModePerm)).Unwrap()
	}

	// 保存文件
	dingo.ErrorIf(ctx.SaveUploadedFile(file, filePath)).Unwrap()

	// todo 入数据库

	// 响应给前端
	Response(ctx)("", CodeSuccess, utils.Join(global.Cfg.Upload.UploadHost, filePath))(OK)
}

// UploadMeiTuanBanner 上传美团Banner图片
func UploadMeiTuanBanner(ctx *gin.Context) {
	file, err := ctx.FormFile("file")

	if err != nil {
		Response(ctx)("上传失败!请上传文件", CodeError, nil)(Error)
	}
	imgType := []string{"image/bmp", "image/png", "image/gif", "image/jpg", "image/jpeg", "image/pjpeg", "image/x-png"}
	fileExt := strings.ToLower(path.Ext(file.Filename))
	// 判断 文件类型
	if !utils.Contains(imgType, file.Header.Get("Content-Type")) {
		Response(ctx)("上传失败!文件类型错误", CodeError, nil)(Error)
	}
	// 判断 文件后缀
	if fileExt != ".png" && fileExt != ".jpg" && fileExt != ".gif" && fileExt != ".jpeg" {
		Response(ctx)("上传失败!只允许png,jpg,gif,jpeg文件", CodeError, nil)(Error)
	}
	// 判断 文件大小 1024*1024*10
	if file.Size > 10485760 {
		Response(ctx)("上传失败!只允许小于10M的文件", CodeError, nil)(Error)
	}
	fileName := utils.Str2Md5(fmt.Sprintf("%s%s", file.Filename, time.Now().String()))
	fileDir := fmt.Sprintf("%s/%d%s/", "static/upload", time.Now().Year(), time.Now().Month().String())
	filePath := fmt.Sprintf("%s%s%s", fileDir, fileName, fileExt)

	// 判断文件路径是否存在
	ok, err := utils.PathExists(fileDir)
	dingo.ErrorIf(err).Unwrap()
	if !ok {
		dingo.ErrorIf(os.Mkdir(fileDir, os.ModePerm)).Unwrap()
	}

	// 保存文件
	dingo.ErrorIf(ctx.SaveUploadedFile(file, filePath)).Unwrap()

	// todo 入数据库

	// 响应给前端
	//Response(ctx)("", CodeSuccess, utils.Join("https://zmapi.cnman.cn/", filePath))(OK)
	//Response(ctx)("", CodeSuccess, &struct {
	//	Name string `json:"name"`
	//	Status string `json:"status"`
	//	Url string `json:"url"`
	//	ThumbUrl string `json:"thumbUrl"`
	//}{
	//	Name: fileName,
	//	Status: "done",
	//	Url: utils.Join("https://zmapi.cnman.cn/", filePath),
	//	ThumbUrl: utils.Join("https://zmapi.cnman.cn/", filePath),
	//})(OK)
	ctx.JSON(200, &struct {
		Uid      string `json:"uid"`
		Name     string `json:"name"`
		Status   string `json:"status"`
		Url      string `json:"url"`
		ThumbUrl string `json:"thumbUrl"`
	}{
		Uid:      "",
		Name:     fileName,
		Status:   "done",
		Url:      utils.Join("https://zmapi.cnman.cn/", filePath),
		ThumbUrl: utils.Join("https://zmapi.cnman.cn/", filePath),
	})
}

func AliOssUploadImage(c *gin.Context) {
	file, err := c.FormFile("file")

	if err != nil {
		Response(c)("上传失败!请上传文件", CodeError, nil)(Error)
	}
	imgType := []string{"image/bmp", "image/png", "image/gif", "image/jpg", "image/jpeg", "image/pjpeg", "image/x-png"}
	fileExt := strings.ToLower(path.Ext(file.Filename))
	// 判断 文件类型
	if !utils.Contains(imgType, file.Header.Get("Content-Type")) {
		Response(c)("上传失败!文件类型错误", CodeError, nil)(Error)
	}
	// 判断 文件后缀
	if fileExt != ".png" && fileExt != ".jpg" && fileExt != ".gif" && fileExt != ".jpeg" {
		Response(c)("上传失败!只允许png,jpg,gif,jpeg文件", CodeError, nil)(Error)
	}
	// 判断 文件大小 1024*1024*10
	if file.Size > 10485760 {
		Response(c)("上传失败!只允许小于10M的文件", CodeError, nil)(Error)
	}
	fileName := utils.Str2Md5(fmt.Sprintf("%s%s", file.Filename, time.Now().String()))
	//访问域名
	endpoint := global.Cfg.Ali.AliossEndpoint
	accessKeyId := global.Cfg.Ali.AccessKey
	accessKeySecret := global.Cfg.Ali.AccessKeySecret
	bucketName := global.Cfg.Ali.AliossBucketName
	//上传文件到OSS时需要指定包含文件后缀在内的完整路径。
	dir := global.Cfg.Ali.AliossUploadImgDir + fileName + fileExt
	// 创建OSSClient实例。
	client, err := oss.New(endpoint, accessKeyId, accessKeySecret)
	if err != nil {
		log.Println("AliOssUploadImage 文件上传失败", err)
		Response(c)("文件上传失败!", CodeError, nil)(Error)
		return
	}
	// 获取存储空间。
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		log.Println("AliOssUploadImage 文件上传失败", err)
		Response(c)("文件上传失败!", CodeError, nil)(Error)
		return
	}

	fileIo, err := file.Open()
	// 上传文件流。
	err = bucket.PutObject(dir, fileIo)
	if err != nil {
		log.Println("AliOssUploadImage 文件上传失败", err)
		Response(c)("文件上传失败!", CodeError, nil)(Error)
		return
	}
	//拼接域名返回给前端
	filePath := global.Cfg.Ali.AliossPath + "/" + dir
	Response(c)("", CodeSuccess, filePath)(OK)
	return
}
